/*-------------------------------------------------------------------------
 *
 * 缺失的 POSIX 线程组件的声明。
 *
 *	  当前为 macOS 提供 pthread_barrier_t 的实现，因为 macOS 缺少该实现。
 *	  这些声明不在 port.h 中，因为这会要求每个翻译单元都包含 <pthread.h>。
 *
 *-------------------------------------------------------------------------
 */

#ifndef PG_PTHREAD_H
#define PG_PTHREAD_H

#include <pthread.h>

#ifndef HAVE_PTHREAD_BARRIER_WAIT

#ifndef PTHREAD_BARRIER_SERIAL_THREAD
#define PTHREAD_BARRIER_SERIAL_THREAD (-1)
#endif

typedef struct pg_pthread_barrier
{
	bool		sense;			/* 我们只需要一个位相位 */
	int			count;			/* 预期线程的数量 */
	int			arrived;		/* 已经到达的线程数量 */
	pthread_mutex_t mutex;
	pthread_cond_t cond;
} pthread_barrier_t;

extern int	pthread_barrier_init(pthread_barrier_t *barrier,
								 const void *attr,
								 int count);
extern int	pthread_barrier_wait(pthread_barrier_t *barrier);
extern int	pthread_barrier_destroy(pthread_barrier_t *barrier);

#endif

#endif
